package com.fdb.efp.nls.service.impl.dw;

import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.basic.framework.core.util.SFTPUtil;
import com.fdb.basic.framework.core.util.StringUtil;
import com.fdb.basic.framework.core.util.ZipUtil;
import com.fdb.efp.nls.service.facade.dw.BdTranFileAnalysisService;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;

/**
 * 
 * 百度迁移文件下载解压
 * 
 * @author ludayong
 * @since 2019年4月12日 上午11:43:34
 * @version 1.0
 */
@Service("bdTranFileAnalysisService")
public class BdTranFileAnalysisServiceImpl implements BdTranFileAnalysisService, FrameworkService {

	private static Logger logger = LoggerFactory.getLogger(BdTranFileAnalysisServiceImpl.class);

	// 迁移文件解析路径
	@Value("${analysis.baiduTranFilePath}")
	private String baiduTranFilePath;

	// 对外SFTP文件服务器：下载地址
	@Value("${analysis.remoteDownBaiduTranFilePath}")
	private String remoteDownBaiduTranFilePath;

	// 对外SFTP文件服务器IP地址
	@Value("${analysis.outFtpHost}")
	private String outFtpHost;

	// 对外SFTP文件服务器用户名
	@Value("${analysis.outUserName}")
	private String outUserName;

	// 对外SFTP文件服务器登录密码
	@Value("${analysis.outPassword}")
	private String outPassword;

	// 对外SFTP文件服务器端口号
	@Value("${analysis.outFtpPort}")
	private int outFtpPort;

	// 数据迁移全量文件名称
	@Value("${analysis.dataTransferFFileName}")
	private String dataTransferFFileName;

	// 数据迁移增量文件名称
	@Value("${analysis.dataTransferIFileName}")
	private String dataTransferIFileName;

	// 分割符
	@Value("${analysis.dataTransferFileSeparation}")
	private String dataTransferFileSeparation;

	// 记录异常信息
	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;

	/**
	 * 
	 * 百度迁移文件下载解压 <br>
	 * 0.1:ludayong:2019年5月20日 下午4:05:34:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月20日 下午4:05:34
	 * @date 2019年5月20日 下午4:05:34
	 * @version 0.1
	 */
	@Override
	public boolean analysisFile(String curDate) throws Exception {
		// 对外SFTP文件服务器下载文件
		boolean result = false;
		logger.info("迁移文件解析开始，迁移文件路径：" + baiduTranFilePath);
		try {
			boolean fileDownRes = downloadFile(curDate);
			// 迁移文件路径
			String tranFilePath = baiduTranFilePath + curDate + ZipUtil.EXT;
			logger.info("解压迁移文件路径：" + tranFilePath);
			// 解析文件
			File tranFile = new File(tranFilePath);
			// 如果文件存在
			if (fileDownRes && tranFile.exists()) {
				// 1、解压迁移文件
				logger.info("解压迁移文件开始");
				result = ZipUtil.unZipAll(new File(tranFile.getAbsolutePath()),
						new File(tranFile.getAbsolutePath().replace(ZipUtil.EXT, "")), true);
				logger.info("解压迁移文件开始结束，解压结果" + result);
			}
		} catch (Exception e) {
			e.printStackTrace();
			String errorMsg = "迁移文件解析出现异常";
			String remark = "迁移文件解析出现异常，异常信息：" + e.getMessage();
			addErrorInfo("", MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		}
		logger.info("迁移文件解析结束，迁移文件路径：" + baiduTranFilePath);
		return result;
	}

	/**
	 * 
	 * 从对外SFTP文件服务器下载文件 <br>
	 * 0.1:ludayong:2019年5月20日 下午3:59:51:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月20日 下午3:59:51
	 * @date 2019年5月20日 下午3:59:51
	 * @version 0.1
	 */
	private boolean downloadFile(String curDate) throws Exception {
		// 连接对外SFTP文件服务器
		SFTPUtil sftpUtil = null;
		// 下载文件是否成功
		boolean result = false;
		try {
			// 从对外SFTP文件服务器下载文件到本地
			logger.info("对外SFTP文件服务器信息：" + outUserName + " / " + outPassword + " IP: " + outFtpHost + " 端口号：" + outFtpPort);
			sftpUtil = new SFTPUtil(outUserName, outPassword, outFtpHost, outFtpPort);
			logger.info("对外SFTP文件服务器下载地址" + remoteDownBaiduTranFilePath);
			// 下载文件
			result = sftpUtil.downFile(sftpUtil, remoteDownBaiduTranFilePath, curDate + ZipUtil.EXT, baiduTranFilePath,
					curDate + ZipUtil.EXT, false);
			logger.info("对外SFTP文件服务器下载文件：" + remoteDownBaiduTranFilePath + curDate + ZipUtil.EXT + "，结果[" + result + "]");
		} catch (Exception e) {
			e.printStackTrace();
			String errorMsg = "对外SFTP文件服务器下载文件出现异常";
			String remark = "对外SFTP文件服务器下载文件出现异常，异常信息：" + e.getMessage();
			addErrorInfo("", MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			if (sftpUtil != null) {
				sftpUtil.closeSFTP();
			}
		}
		return result;
	}

	/**
	 * 
	 * 从对外SFTP文件服务器下载全量文件 <br>
	 * 0.1:ludayong:2019年6月25日 上午8:52:37:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年6月25日 上午8:52:37
	 * @date 2019年6月25日 上午8:52:37
	 * @version 0.1
	 */
	public boolean downloadFFile(String curDate) throws Exception {
		// 连接对外SFTP文件服务器
		SFTPUtil sftpUtil = null;
		// 下载文件是否成功
		boolean result = false;
		// 下载个数
		int downNum = 0;
		try {
			// 数据迁移全量文件名称
			if (StringUtil.isNullorBank(curDate)) {
				logger.error("批次日期[" + curDate + "]为空，请检查！");
				return result;
			}
			if (StringUtil.isNullorBank(dataTransferFFileName)) {
				logger.error("数据迁移全量文件名称配置[" + dataTransferFFileName + "]为空，请检查！");
				return result;
			}
			// 从对外SFTP文件服务器下载文件到本地
			logger.info("对外SFTP文件服务器信息：" + outUserName + " / " + outPassword + " IP: " + outFtpHost + " 端口号：" + outFtpPort);
			sftpUtil = new SFTPUtil(outUserName, outPassword, outFtpHost, outFtpPort);
			logger.info("对外SFTP文件服务器下载地址" + remoteDownBaiduTranFilePath);
			String newDataTransferFFileName = dataTransferFFileName.trim().replaceAll("curDate", curDate);
			// 数据迁移全量文件名称
			String[] downFFileNames = newDataTransferFFileName.split(dataTransferFileSeparation);
			for (String fFileName : downFFileNames) {
				logger.info("对外SFTP文件服务器下载文件：" + remoteDownBaiduTranFilePath + fFileName);
				// 下载文件
				boolean res = sftpUtil.downFile(sftpUtil, remoteDownBaiduTranFilePath, fFileName, baiduTranFilePath, fFileName, false);
				logger.info("对外SFTP文件服务器下载文件：" + remoteDownBaiduTranFilePath + fFileName + "，结果[" + res + "]");
				if (res) {
					downNum++;
				}
			}
			if (downNum == downFFileNames.length) {
				result = true;
			} else {
				throw new Exception("数据迁移全量文件下载数据量不正确！");
			}
		} catch (Exception e) {
			e.printStackTrace();
			String errorMsg = "对外SFTP文件服务器下载文件出现异常";
			String remark = "对外SFTP文件服务器下载文件出现异常，异常信息：" + e.getMessage();
			addErrorInfo("", MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			if (sftpUtil != null) {
				sftpUtil.closeSFTP();
			}
		}
		return result;
	}

	/**
	 * 
	 * 从对外SFTP文件服务器下载曾量文件<br>
	 * 0.1:ludayong:2019年6月25日 上午8:52:37:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年6月25日 上午8:52:37
	 * @date 2019年6月25日 上午8:52:37
	 * @version 0.1
	 */
	public boolean downloadIFile(String curDate) throws Exception {
		// 连接对外SFTP文件服务器
		SFTPUtil sftpUtil = null;
		// 下载文件是否成功
		boolean result = false;
		// 下载个数
		int downNum = 0;
		try {
			// 数据迁移增量文件名称
			if (StringUtil.isNullorBank(curDate)) {
				logger.error("批次日期[" + curDate + "]为空，请检查！");
				return result;
			}
			if (StringUtil.isNullorBank(dataTransferIFileName)) {
				logger.error("数据迁移增量文件名称配置[" + dataTransferIFileName + "]为空，请检查！");
				return result;
			}
			// 从对外SFTP文件服务器下载文件到本地
			logger.info("对外SFTP文件服务器信息：" + outUserName + " / " + outPassword + " IP: " + outFtpHost + " 端口号：" + outFtpPort);
			sftpUtil = new SFTPUtil(outUserName, outPassword, outFtpHost, outFtpPort);
			logger.info("对外SFTP文件服务器下载地址" + remoteDownBaiduTranFilePath);
			String newDataTransferIFileName = dataTransferIFileName.trim().replaceAll("curDate", curDate);
			// 数据迁移全量文件名称
			String[] downIFileNames = newDataTransferIFileName.split(dataTransferFileSeparation);
			for (String iFileName : downIFileNames) {
				// 下载文件
				boolean res = sftpUtil.downFile(sftpUtil, remoteDownBaiduTranFilePath, iFileName, baiduTranFilePath, iFileName, false);
				logger.info("对外SFTP文件服务器下载文件：" + remoteDownBaiduTranFilePath + iFileName + "，结果[" + res + "]");
				if (res) {
					downNum++;
				}
			}
			if (downNum == downIFileNames.length) {
				result = true;
			} else {
				throw new Exception("数据迁移增量文件下载数据量不正确！");
			}
		} catch (Exception e) {
			e.printStackTrace();
			String errorMsg = "对外SFTP文件服务器下载文件出现异常";
			String remark = "对外SFTP文件服务器下载文件出现异常，异常信息：" + e.getMessage();
			addErrorInfo("", MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			if (sftpUtil != null) {
				sftpUtil.closeSFTP();
			}
		}
		return result;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年5月7日 上午11:31:23:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月7日 上午11:31:23
	 * @date 2019年5月7日 上午11:31:23
	 * @version 0.1
	 */
	public void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
